package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.common.ISubject;
import pe.com.cotelasa.scp.controlador.backingBean.BKCompOrdenPOrdenCS;
import pe.com.cotelasa.scp.controlador.backingBean.BKGuiaDeRemision;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@SuppressWarnings({"serial", "unchecked"})
@Named(value = "MBCompOrdenPOrdenCS")
@Scope("request")
public class MBCompOrdenPOrdenCS extends MBGenerico implements ISubject, Serializable {

    @Inject
    private BKCompOrdenPOrdenCS bkCompOrdenPOrdenCS;
    /*@Inject
     private BKGuiaDeRemision bkGuia;*/
    @Inject
    private IServicioOrdenCompraServicio sOrdenCs;
    @Inject
    private IServicioOrdenPedido sOrdenP;
    @Autowired
    BKSession session;

    public void initComponent(Collection<OrdenPedido> listaOrdenP, Collection<OrdenCompraServicio> listaOrdenOCS) {
        bkCompOrdenPOrdenCS.setListaOrdenesPedido(listaOrdenP);
        bkCompOrdenPOrdenCS.setListaOrdenesCS(listaOrdenOCS);
        bkCompOrdenPOrdenCS.setIdOrdenPedido(0);
        bkCompOrdenPOrdenCS.getObservers().clear();
    }

    public void listarOrdenCS(/*OrdenPedido ordenPedido*/int i, String tipoOrden) {
        try {
            Collection<OrdenCompraServicio> listaOrdenCS = new ArrayList<OrdenCompraServicio>();
            bkCompOrdenPOrdenCS.setIdOrdenPedido(i);
            if (i != 0) {
                OrdenPedido ordenPedido = sOrdenP.conseguirOrdenPedidoPorId(i);
                listaOrdenCS = sOrdenCs.listarOrdenCompraServicioPorNroOrden(
                        ordenPedido.getCodigoOrdenPedido(), ordenPedido.getEstadoPedido(), session.getEmpresa().getId());

            } else {
                OrdenCompraServicio ordenCS = new OrdenCompraServicio();
                ordenCS.setIdEmpresa(session.getEmpresa());
                ordenCS.setIdOrdenPedido(new OrdenPedido(0));
                ordenCS.setCodigo("");
                ordenCS.setDescripcion("");
                ordenCS.setEstadoOrden(""+OrdenCompraServicio.ESTADO_ORDEN_SC.ABIERTO.getValor());
                ordenCS.setTipo('%');

                listaOrdenCS = sOrdenCs.buscarOrdenCompraServiciosPorFiltro(ordenCS,null,null);
            }

            List<OrdenCompraServicio> listaOCS = new ArrayList<OrdenCompraServicio>();
            if (tipoOrden.equalsIgnoreCase("C")) {
                for (OrdenCompraServicio item : listaOrdenCS) {
                    if (item.getTipo() == 'C') {
                        listaOCS.add(item);
                    }
                }
            } else {
                if (tipoOrden.equalsIgnoreCase("S")) {
                    for (OrdenCompraServicio item : listaOrdenCS) {
                        if (item.getTipo() == 'S') {
                            listaOCS.add(item);
                        }
                    }
                } else {
                    listaOCS.addAll(listaOrdenCS);
                }
            }

            bkCompOrdenPOrdenCS.setListaOrdenesCS(listaOCS);
            notificarObservadores();
            //bkGuia.getGuiaFormulario().setDetalleGuiaRemisions(new ArrayList<DetalleGuiaRemision>());
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public Collection<OrdenPedido> buscarOrdenPedido(String ordenPedidoABuscar) {
        Collection<OrdenPedido> listaOrdenesPedidoEncontrados = new ArrayList<OrdenPedido>();
        for (OrdenPedido ordenPedido : bkCompOrdenPOrdenCS.getListaOrdenesPedido()) {
            if (ordenPedido.getCodigoOrdenPedido().startsWith(
                    ordenPedidoABuscar)) {
                listaOrdenesPedidoEncontrados.add(ordenPedido);
            }
        }
        return listaOrdenesPedidoEncontrados;
    }

    public Collection<OrdenCompraServicio> buscarOrdenCS(String ordenCSBuscar) {
        Collection<OrdenCompraServicio> liOrdenCompraServicios = new ArrayList<OrdenCompraServicio>();
        for (OrdenCompraServicio ordenCS : bkCompOrdenPOrdenCS.getListaOrdenesCS()) {
            if (ordenCS.getCodigo().startsWith(ordenCSBuscar)) {
                liOrdenCompraServicios.add(ordenCS);
            }
        }
        return liOrdenCompraServicios;
    }

    @Override
    public void addObserver(IObserver observador) {
        bkCompOrdenPOrdenCS.addObservers(observador);
    }

    @Override
    public void notificarObservadores() {
        for (IObserver observer : bkCompOrdenPOrdenCS.getObservers()) {
            observer.actualizarObservador(bkCompOrdenPOrdenCS.getIdOrdenPedido());
        }
    }
}
